
#include <malloc.h>

#include "envio-resultado.h"
#include "../varios/log.h"
#include "../varios/mensajes.h"
#include "../varios/compresion.h"
#include "../varios/mpi-utiles.h"
#include "../../compartido/vectores.h"


/*
 * Implementacion de funcion definida en cabecera
 */
void enviarVectorFinal(struct VECTOR *vector, int destino) {
    
    LOGGER("Enviamos el resultado al destino %d", destino);
    
    // Creamos el buffer para lectura del vector
    int *bufferLectura = malloc(MAX_CANT_ELEM*sizeof(int));
    
    long long offsetVector = 0;
    long long tamVector = obtenerDimension(vector);

    while (offsetVector<tamVector) {
        
        LOGGER("Offset del vector al inicio de ciclo %l", offsetVector);

        // Calculamos cuantos datos quedan por enviar
        long long cantRestante = tamVector-offsetVector;

        // establecemos cuantos datos vamos a enviar en esta iteracion
        int leerCantidad;
        if (cantRestante >= MAX_CANT_ELEM) {
            leerCantidad = MAX_CANT_ELEM;
        } else {
            leerCantidad = cantRestante;
        }

        LOGGER("Debemos enviar %d elementos de un total de %l", leerCantidad, tamVector);
        
        // Leemos los elementos que enviaremos
        long long p;
        for (p=0; p<leerCantidad; p++) {
            bufferLectura[p] = obtenerValor(vector, offsetVector+p);
        }

        LOGGER("VECTOR POR ENVIAR %s", imprimirBloqueInt(bufferLectura, leerCantidad));
        
        // Comprimimos los datos leidos
        char *datosComprimir = (char *)bufferLectura;
        int tamDatos = sizeof(int) * leerCantidad;
        struct DATOS_COMPRIMIDOS comp = comprimir(datosComprimir, tamDatos);

        // Enviamos los datos comprimidos
        LOGGER("Enviamos los datos comprimidos");
        enviarDatos(destino, MSG_VECTOR_FINAL, comp.datosCompr, comp.longitudCompr);
        
        // Liberamos memoria
        free(comp.datosCompr);

        // Adaptamos el offset del vector para la siguiente iteracion
        offsetVector += leerCantidad;
        
    }
    
    // Liberamos memoria
    free(bufferLectura);
    LOGGER("Finaliza envio de partes del vector final");
    
}
